home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 March / CHIP Mart 1997.iso / SesProg / VDIGIT.ZIP / VOICEKIT.DOC < prev    next >
Text File  |  1989-06-24  |  31KB  |  615 lines

  1.                Digitized Voice Programmer's Toolkit for the PC
  2.                -----------------------------------------------
  3.  
  4.                                Version 1.0
  5.  
  6.                   Copyright (c) 1988,1989, Farpoint Software
  7.  
  8.        *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *   *
  9.  
  10.  
  11.   **************************************************************************
  12.   *                                                                        *
  13.   *  To those of you who have HIDI.ARC and/or DIGITS.ARC, welcome back.    *
  14.   *  This new release will serve as a major upgrade to things you already  *
  15.   *  have.                                                                 *
  16.   *                                                                        *
  17.   **************************************************************************
  18.  
  19.  
  20. Introduction
  21. ------------
  22.  
  23. This toolkit is a combination of software and hardware designed for the
  24. purpose of mechanizing and simplifying the process by which programmers may
  25. create digitized voice recordings, store them on disk, edit the voice data
  26. files, and incorporate digitized voice playback into their own high-level
  27. language programs.
  28.  
  29. The recording of digitized voice requires a small, inexpensive hardware device
  30. to be built. Schematics and printed circuit board layout files are provided
  31. for this device.
  32.  
  33. Playback of the digitized voice, however, requires NO SPECIAL HARDWARE. The
  34. sound is produced with the built-in speaker provided in nearly all PC's and
  35. PC-compatible machines. This means that programs may be written for general
  36. distribution which will play voice messages on the user's machine as it
  37. exists.
  38.  
  39. Here is a list of the major features of the current software package:
  40.  
  41.   (1) Operates under the DOS environment.
  42.   (2) Provides a full set of voice record/playback control routines which
  43.       are directly callable from many high-level languages including C
  44.       and Pascal. They are also of course callable from assembly language.
  45.   (3) All voice operations proceed IN THE BACKGROUND. The control routines
  46.       return to the caller immediately, and voice playback occurs
  47.       simultaneously with the continuing execution of the main program.
  48.       The main program may call a status routine at any time to check on
  49.       the progress of the voice playback.
  50.   (4) There are no length limitations on either the size of the memory
  51.       buffers or the size of the voice data files on disk other than the
  52.       physical limits of the machine itself. 64k is not a special number.
  53.   (5) A sophisticated voice data file editor is provided. This gives the
  54.       programmer a set of capabilities similar to those available on a
  55.       conventional tape recorder. Position markers, live overwriting,
  56.       selective erasure, cut-and-paste, and assorted other features make
  57.       the produciton of "refined" voice files an easy task.
  58.   (6) Several short example programs are included, written in both C and
  59.       assembly language, which demonstrate the use of the calls to the
  60.       voice modules. There is even an example of a memory-resident program
  61.       which detects the pressing of the left shift key and plays a short
  62.       voice message when this occurs. (Foreground processing continues
  63.       undisturbed.)
  64.  
  65.  
  66. Shareware Notice
  67. ----------------
  68.  
  69. The Digitized Voice Programmer's Toolkit is released as Shareware. This is
  70. copyrighted material; it is NOT "free software". You are permitted to
  71. experiment with this package long enough to determine if it suits your needs,
  72. but if you will be making use of the material in your own programs, then a
  73. license fee of $50 is required. NO PROGRAM WHICH MAKES USE OF THE MATERIALS
  74. IN THIS TOOLKIT MAY BE SOLD COMMERCIALLY OR ON A CONTRACT BASIS UNLESS THE
  75. SELLER HAS PAID THE LICENSE FEE. Please make the check or money order payable
  76. to:
  77.  
  78.         Farpoint Software
  79.         2501 Afton Court
  80.         League City, Texas 77573
  81.  
  82. For convenience, a registration form is included in the file REGISTER.FRM.
  83.  
  84. As a registered user, you will receive updates automatically long before they
  85. are released to BBS's. You will also receive a copy of the source code to the
  86. VDFE editor. Registered users, of course, are given higher priority if
  87. programming assistance or hardware construction assistance is requested.
  88.  
  89. You are granted permission to distribute copies of the Digitized Voice
  90. Programmer's Toolkit, provided that (1) no fee is charged for such copies,
  91. other that a nominal disk duplication fee, (2) these files are distributed
  92. in their original, unmodified form, and (3) ALL the files in the original
  93. archive are included with each copy. (See "List of Files" below.)
  94.  
  95. If you paid a "disk duplication fee" or other such fee to a distributor of
  96. public domain and shareware programs, be aware that the payment of this fee
  97. DOES NOT constitute registration of this Toolkit. Likewise, the payment of a
  98. fee to any Bulletin Board Service for the time required to download this
  99. Toolkit DOES NOT constitute registration. Registration occurs only through
  100. direct interaction with Farpoint Software.
  101.  
  102. If more information is needed, write or contact Alan D. Jones through
  103. Compuserve Information Service at user ID 74030,554.
  104.  
  105.  
  106. List of Files
  107. -------------
  108.  
  109. The files included with the Digitized Voice Programmer's Toolkit are:
  110.  
  111.         BIN2ASM
  112.         BIN2ASM.C
  113.         BIN2ASM.EXE
  114.         EMBEDDED
  115.         EMBEDDED.C
  116.         EMBEDDED.EXE
  117.         EVM.PRE
  118.         EVM.SUF
  119.         EVM.VOI
  120.         LONGTEST.VOI
  121.         README.1ST
  122.         REGISTER.FRM
  123.         RUN_ME.BAT
  124.         TSR
  125.         TSR.ASM
  126.         TSR.EXE
  127.         TSRVM.PRE
  128.         TSRVM.SUF
  129.         TSRVM.VOI
  130.         VDFE.EXE
  131.         VMSCH.HPP
  132.         VOICEKIT.DOC
  133.         VPMOD.ASM
  134.         VPMOD.DOC
  135.         VPMOD.H
  136.         VPMOD.OBJ
  137.         VPTEST
  138.         VPTEST.C
  139.         VPTEST.EXE
  140.         VRMOD.ASM
  141.         VRMOD.DOC
  142.         VRMOD.H
  143.         VRMOD.OBJ
  144.         VRTEST
  145.         VRTEST.C
  146.         VRTEST.EXE
  147.  
  148. If you received the Toolkit with any of the above files missing, please
  149. notify Farpoint Software.
  150.  
  151.  
  152. Description of Voice Subroutine Modules
  153. ---------------------------------------
  154.  
  155. The key software elements in the kit are two assembly language programs,
  156. VRMOD.ASM and VPMOD.ASM, and their assembled OBJ files. These are not stand-
  157. alone programs. They are designed to be linked with other programs to provide
  158. the voice control routines. The calls associated with recording are in
  159. VRMOD, and the calls associated with playback are in VPMOD. Any given program
  160. may be linked with either or both of these modules. Typically, a program
  161. designed for general distribution would be linked only with VPMOD, since
  162. recording requires the hardware device.
  163.  
  164. The external hooks to the two modules consist of various "public" procedure
  165. names. All procedures use the Pascal calling convention, since most high-level
  166. language compilers can support this calling method. The Pascal calling
  167. convention has the following meaning:
  168.  
  169.   (1) Procedure names are all caps, and are not preceeded by an underscore.
  170.   (2) Procedures are called with "far" (intersegment) calls.
  171.   (3) Short return values appear in the AX register; long return values
  172.       appear in DX:AX.
  173.   (4) Parameters are pushed onto the stack in left-to-right order; i.e. the
  174.       first parameter in the list is pushed first. If the parameter is a
  175.       doubleword, then the high order word is pushed first.
  176.   (5) The called subroutine is responsible for clearing the parameters from
  177.       the stack upon return.
  178.  
  179. The above list will be of interest primarily to assembly language programmers.
  180. When working in a high-level language, it is necessary only to make sure that
  181. the compiler is using the proper calling method. For C programs, two header
  182. files have been included. They are VRMOD.H and VPMOD.H. At the beginning of
  183. any C program which is to use the voice playback routines, insert the line:
  184.  
  185. #include "vpmod.h"
  186.  
  187. This file contains prototypes of all procedure calls in VPMOD.ASM, declared
  188. in a way that causes the compiler to generate correct calling code.
  189.  
  190. The details of how each individual procedure call operates will be found in
  191. the separate documents VRMOD.DOC and VPMOD.DOC. It is suggested that you
  192. print these files for use as reference material while writing programs.
  193.  
  194. It is possible to link both VRMOD.OBJ and VPMOD.OBJ to the same program, but
  195. you should NOT have both packages initialized at the same time. Each package
  196. assumes "ownership" of timer channel zero, and this would cause a conflict
  197. over the setting of the hardware timer interval, not to mention the problem
  198. of possible insufficient CPU time to execute both interrupt routines at every
  199. timer tick (at 16500 Hz). The solution here is (1) never attempt to record and
  200. play back at the same time, and (2) don't call PVOICE_INIT until playback is
  201. ready to begin and be sure to call PVOICE_CLEANUP immediately after playback
  202. ends. (Similar rules apply to recording.)
  203.  
  204.  
  205. Example Programs
  206. ----------------
  207.  
  208. Note: "Make" files acceptable to Microsoft's Make utility are included
  209.       for all the example programs. The compiler used was the Microsoft
  210.       C Compiler version 5.10. The assembler was the Microsoft Macro
  211.       Assembler version 5.10. The make files are written to assume that
  212.       the compiler is installed to include the Large model library and
  213.       that the default operating system is DOS. If the compiler defaults
  214.       to the OS/2 operating system, then change the make files so that
  215.       all occurrences of "llibce" become "llibcer".
  216.  
  217. VRTEST.C (VRTEST.EXE):
  218.   [Related files: VRTEST]
  219.   This program works like RECORD.COM provided with the first voice
  220.   digitization package released in 1988. It demonstrates the use of
  221.   all the procedure calls and features in VRMOD. To execute the program,
  222.   first attach the voice recording circuit to a COM port, then at the
  223.   DOS prompt type: VRTEST 1 TESTFILE.VOI. If you are using COM2, then
  224.   substitute "2" for the "1". The filename "TESTFILE.VOI" may be any filename.
  225.   Recording will begin and messages will scroll on the screen indicating the
  226.   number of bytes of data recorded. Writing to the file will be performed
  227.   "on the fly". The memory buffer size is currenly set to 16k, but may be
  228.   changed by editing and recompiling the program. Recording will continue
  229.   until either the <Esc> key is pressed or the disk is full. The size of the
  230.   memory buffer should be at least 8k, but beyond this point it is actually
  231.   irrelevant as long as calls to RVOICE_CATCHUP are made frequently enough
  232.   (which means at least once every 3 seconds).
  233.  
  234. VPTEST.C (VPTEST.EXE):
  235.   [Related files: VPTEST]
  236.   This is the counterpart to VRTEST. It demonstrates the use of all the
  237.   procedure calls in VPMOD. As in VRTEST, the memory buffer is currently 16k
  238.   but may be changed by editing and recompiling. The command line to execute
  239.   the program is VPTEST TESTFILE.VOI, where "TESTFILE.VOI" is the name of
  240.   a file containing voice data. The reading of the file will occur as needed
  241.   to keep the buffer full or until all bytes have been read. The size of
  242.   the memory buffer needs to be increased beyond 8K only if it is not possible
  243.   to call PVOICE_CATCHUP at least once every 3 seconds. (Note that it may
  244.   also be advisable to increase the buffer size if the file is being read
  245.   from a floppy disk, since accesses may be quite slow.)
  246.  
  247. EMBEDDED.C (EMBEDDED.EXE):
  248.   [Related files: EMBEDDED, EVM.VOI, EVM.PRE, EVM.SUF]
  249.   This is a simple example of the techniques used to embed voice data in an
  250.   executable program. Instead of reading a separate voice file, the voice
  251.   data is part of the EXE file. Note that the "make" file in this case is
  252.   as important to study as the C program. The trick here is to convert the
  253.   raw binary voice data file into an OBJ file that we can feed through the
  254.   linker. This is done in three stages: (1) The file-cruncher program BIN2ASM
  255.   is used to create a file containing only a long list of assembly language
  256.   DB statements equivalent to the binary data; (2) The prefix file EVM.PRE
  257.   and the suffix file EVM.SUF are combined with the DB statements to form
  258.   an assembly language module containing all necessary segment brackets and
  259.   public declarations; (3) This module is assembled and linked with the main
  260.   program. The content of the prefix and suffix files depend on the specific
  261.   application; in this example we use only a single segment and a single
  262.   block of voice data. A more complex program may contain several modules of
  263.   this type or have an assortment of labels within a single module. Since the
  264.   assembler requires segments to be 64k or less, BIN2ASM places a marker
  265.   comment (a semicolon and a string of minus signs) at each 64k boundary in
  266.   its output file. If this happens, you must edit the file to end a segment
  267.   and begin a new one at each of these boundaries.
  268.  
  269. TSR.ASM (TSR.EXE):
  270.   [Related files: TSR, TSRVM.VOI, TSRVM.PRE, TSRVM.SUF]
  271.   This serves as both an example of a pure assembly language program using
  272.   VPMOD and a technique for including voice playback in a memory-resident
  273.   program. The voice data is embedded in the EXE file in the same way as it
  274.   was done in EMBEDDED.EXE above. Otherwise, the program is fairly
  275.   conventional. There is one major caution to observe, however: since a
  276.   memory-resident program may play voice concurrently with the execution of
  277.   another unknown program, don't set the file read flag (in PVOICE_START)
  278.   to 1 and don't use PVOICE_CATCHUP! Use of the "read-on-the-fly" feature
  279.   of the voice control routines calls DOS to read the disk. If a DOS call
  280.   is made within an interrupt service routine (especially a timer tick
  281.   routine), the interrupt may have occurred while a DOS call was already in
  282.   progress. In this case, DOS will be "re-entered", and it is NOT re-entrant.
  283.   Doing this will almost certainly cause a system crash.
  284.  
  285.   If you are already familiar with the above problem, and have worked out a
  286.   system of calling DOS in the background during its "safe" moments, then
  287.   you probably will be able to use read-on-the-fly. Always call PVOICE_START,
  288.   PVOICE_INIT, PVOICE_CLEANUP, and PVOICE_CATCHUP during "safe" times. Also,
  289.   remember that timer interrupts will now be happening at about 16500 Hz, so
  290.   make sure that your program never disables interrupts for more that a very
  291.   short time. (One more thing: if you must hook INT 8, do it BEFORE calling
  292.   PVOICE_INIT.)
  293.  
  294.  
  295. The Voice Data File Editor (VDFE)
  296. ---------------------------------
  297.  
  298. This program provides a convenient environment for creating, editing, and
  299. generally patching together voice data files. Its function resembles that of
  300. a tape recorder. It edits files only within its RAM buffer, which is limited
  301. by the amount of memory on the machine available to DOS. On a 640k machine,
  302. this translates to about 470k of buffer space, or 225 seconds (3 minutes and
  303. 45 seconds) of continuous sound. If you need to edit nonstop chunks of voice
  304. data longer than that, they will have to be edited piecemeal and concatenated
  305. afterward. (Of course, multi-megabyte voice data files may be recorded using
  306. VRTEST or a similar program. If it turns out that people really need to edit
  307. super-long files on a regular basis, I will include infinite-file-length
  308. editing on a future release.)
  309.  
  310. VDFE requires no command line parameters. Upon execution, it displays its
  311. primary screen and waits for user input. This consists primarily of single
  312. keystroke commands, which are hereby documented in some detail:
  313.  
  314. <Up arrow> and <Down arrow>:
  315.   These are used to scroll the contents of the Operating Instructions window
  316.   in the lower right area of the screen. The window displays one-line
  317.   descriptions of all the keystroke commands.
  318.  
  319. <F1>:
  320.   Displays an information screen which briefly describes the purpose and
  321.   operation of VDFE.
  322.  
  323. <Esc>:
  324.   Exits to DOS. If the contents of the editing buffer have been altered since
  325.   the last save to disk, the user is asked to confirm the exit command.
  326.  
  327. <F2>:
  328.   Increments the COM port number shown at the left side of the screen. This
  329.   will be the port used for recording. Press <F2> repeatedly until the desired
  330.   port number shows.
  331.  
  332. <F3>:
  333.   Requests a file name, then loads the file into the edit buffer starting at
  334.   offset zero. The end-of-file position will be set to match the length of the
  335.   file. If the specified file does not exist, the user will be asked whether
  336.   to create the file. If the answer is "yes", then a zero-length file is
  337.   created and the end-of-file position is set to zero. The actual data in the
  338.   edit buffer remains unchanged.
  339.  
  340. <Alt F3>:
  341.   Requests the entry of a new file name. This becomes the current file name as
  342.   shown at the left side of the screen. Nothing is done with this name
  343.   immediately. The new file name will be used in subsequent "save current
  344.   data" (<F4>)operations.
  345.  
  346. <F4>:
  347.   Saves current data. The current filename is opened and truncated, and the
  348.   contents of the edit buffer from offset zero to the offset shown as the
  349.   end-of-file are written to the file.
  350.  
  351. <Space bar>:
  352.   The "Stop" button. If a record or playback operation is in progress, it is
  353.   stopped.
  354.  
  355. <Enter>:
  356.   The "play" button. The contents of the edit buffer are played back through
  357.   the speaker starting from the current position. Playback ends at the
  358.   end-of-file position. If the current position is greater than or equal to
  359.   the end-of-file position, playback will not occur.
  360.  
  361. <Insert>:
  362.   The "record" button. Digitized voice is input through the selected COM port
  363.   and written into the edit buffer. Writing begins at the current position,
  364.   overwriting existing data. Recording can be stopped by pressing <Space>,
  365.   <Enter>, or any key which normally has the function of changing the current
  366.   position. If the current position during recording exceeds the end-of-file
  367.   position, then the end-of-file position is moved forward continuously to
  368.   match the current position. If the current position reaches the end of the
  369.   edit buffer, then wrap-around will occur, causing recording to continue at
  370.   offset zero.
  371.  
  372. <Left arrow>:
  373.   Medium-speed rewind. The current position will be decremented by 256, which
  374.   corresponds to about 1/8 second of voice time.
  375.  
  376. <Right arrow>:
  377.   Medium-speed forward. The current position will be incrememted by 256.
  378.  
  379. <Ctrl left arrow>:
  380.   Fine rewind. The current position will be decremented by 1 byte.
  381.  
  382. <Ctrl right arrow>:
  383.   Fine forward. The current position will be incremented by 1 byte.
  384.  
  385. <Page Up>:
  386.   High-speed rewind. The current position will be decremented by 8192, which
  387.   corresponds to about 4 seconds of voice time.
  388.  
  389. <Page Down>:
  390.   High-speed forward. The current position will be incremented by 8192.
  391.  
  392. <Home>:
  393.   The current position is set to zero.
  394.  
  395. <End>:
  396.   The current position is set to match the end-of-file position.
  397.  
  398. <Ctrl end>:
  399.   The end-of-file position is set to match the current position.
  400.  
  401. <0> through <9>:
  402.   Set marker. There are 10 markers, numbered 0 through 9. Each marker consists
  403.   of a slot in which a "current position" may be stored. Any time a digit key
  404.   is pressed, regardless of the stopped/playing/recording state, the current
  405.   position at that instant is copied into the corresponding marker. The marker
  406.   values are displayed in a window in the lower left area of the screen.
  407.  
  408. <Alt 0> through <Alt 9>:
  409.   Pressing a digit key (on the main section of the keyboard, NOT the numeric
  410.   keypad) while holding the <Alt> key down causes the current position to
  411.   change to match the value stored in the corresponding marker.
  412.  
  413. <F5> and <F6>:
  414.   Change the marker numbers which are assigned the "begin" and "end" flags.
  415.   In the left column of the marker window, two of the marker number positions
  416.   always contain 'beg' and 'end' rather than a digit. These are the ones used
  417.   in any operation that refers to a "marked section". Initially, marker 0 is
  418.   the "begin" marker and marker 1 is the "end". Press <F5> repeatedly to move
  419.   the 'beg' to the desired marker. Press <F6> repeatedly to move the 'end' to
  420.   the desired marker. The two flags are not allowed to be assigned to the same
  421.   marker.
  422.  
  423. <Tab>:
  424.   Sets the current position to match the "begin" marker and initiates a
  425.   playback operation which will terminate at the "end" marker.
  426.  
  427. <F7>:
  428.   A filename is requested from the user. The contents of the marked section of
  429.   the edit buffer are written to this file. If the file already exists, it
  430.   will be overwritten. The current filename remains unchanged.
  431.  
  432. <F8>:
  433.   A filename is requested from the user. The contents of this file are copied
  434.   into the edit buffer starting at the "begin" marker. The "end" marker is
  435.   changed to reflect the size of the file. The current filename remains
  436.   unchanged.
  437.  
  438. <F9>:
  439.   The marked section will be erased (filled with zeros).
  440.  
  441. <F10>:
  442.   This causes the editor to enter a mode in which text may be typed into the
  443.   column of the marker window titled "comments". These are simply reference
  444.   notes and have no effect on the operation of the editor. The comment entry
  445.   mode is exited by pressing the <Esc> key.
  446.  
  447.  
  448. Graphical Print Files
  449. ---------------------
  450.  
  451. These files are prepared for output to an HP LaserJet Plus printer with the
  452. minimum memory configuration (512k). To print one of the files, use
  453. "COPY /B <filename> LPT1:" (or LPT2 if appropriate). The following lists the
  454. contents of each file:
  455.  
  456.   Filename        Density       Description
  457.   --------        -------       -----------
  458.  
  459.   VMSCH.HPP       150 dpi       The schematic to the Digitizer.
  460.  
  461.   VMPCB.125       300 dpi       A positive print of the "copper side" of
  462.                                  a single-sided circuit board implementing
  463.                                  the Digitizer, suitable for photo-reduction
  464.                                  to board manufacturing negatives. Scale is
  465.                                  1.250, producing the largest image that will
  466.                                  fit in the LaserJet 512k memory.
  467.  
  468.   VMSLK.125       300 dpi       A positive print of a silkscreen component
  469.                                  placement guide for the component side of
  470.                                  the board. This may be either silkscreened
  471.                                  onto the board or simply printed out and
  472.                                  referred to while building the board. Scale
  473.                                  is 1.250.
  474.  
  475.   VMDRL.125       300 dpi       A drilling guide for use in making numeric-
  476.                                  control tool tapes with a digitizing pad.
  477.                                  This print will not be of much use to those
  478.                                  who will be drilling the holes by hand.
  479.                                  Scale is 1.250.
  480.  
  481.   VMPCB.100       300 dpi       A duplicate of VMPCB.125, but scaled 1:1 for
  482.                                  use with contact-print or direct transfer
  483.                                  methods of producing the negatives.
  484.  
  485.   VMSLK.100       300 dpi       A duplicate of VMSLK.125, scaled 1:1.
  486.  
  487.   VMDRL.100       300 dpi       A duplicate of VMDRL.125, scaled 1:1.
  488.  
  489. Due to the large size of the printed circuit board files, and the probability
  490. that most users will not actually want to manufacture a board for this
  491. device, these files are placed in a separate archive. Only the schematic,
  492. VMSCH.HPP, is included in this archive.
  493.  
  494. All of these plots are available to registered users formatted for output on
  495. a variety of other printers and pen plotters (photoplotters also). Contact
  496. Farpoint Software at the address / CIS number shown in the Shareware Notice
  497. section of this document.
  498.  
  499.  
  500. Schematic Notes
  501. ---------------
  502.  
  503. The circuit is designed to operate from two 9-volt batteries connected to J1
  504. and J2. The original circuit used a single-ended supply. This modification
  505. requires fewer parts and produces the correct RS-232 voltages at the output.
  506.  
  507. Pad resistors have been added to the trimpot. This control in the original
  508. version was somewhat difficult to adjust. The pad resistors decrease the
  509. sensitivity of this control enough to allow a 1-turn potentiometer to be used,
  510. thus reducing the length of the "hunt" for the proper position.
  511.  
  512.     If your serial port uses a DB-9 connector, the cable from J4 is:
  513.  
  514.  J4 pin 1 -------- DB-9 pin 5    (Ground)
  515.  J4 pin 2 -------- DB-9 pin 8    (CTS)
  516.  
  517.     If your serial port uses a DB-25 connector, the cable from J4 is:
  518.  
  519.  J4 pin 1 -------- DB-25 pin 7    (Ground)
  520.  J4 pin 2 -------- DB-25 pin 5    (CTS)
  521.  
  522. The circuit consists of two stages of voltage amplification with some
  523. high-pass filtering built into the coupling capacitors, followed by a
  524. differentiator. The output of the differentiator is fed to a voltage
  525. comparator, thus producing an output which has approximately the following
  526. relationship to the input from the microphone: If the derivative of the
  527. speech waveform if positive, then the output is logic zero; If the derivative
  528. of the speech waveform is negative, then the output is logic one. The
  529. transition timing at the output is entirely analog in nature; there is no
  530. synchronizing clock signal anywhere in the circuit.
  531.  
  532. If the output of this circuit is connected directly to a speaker, the
  533. resulting sound will still be an understandable version of the input. Since
  534. the output consists of nothing but a digital bit stream, the job of the
  535. computer becomes that of simply recording and accurately reproducing this bit
  536. stream. 
  537.  
  538. The trimpot at the input of amplifier U3 is used to set the DC idle voltage
  539. output from the differentiator to somewhere near the threshold of comparator
  540. U4. There will be a considerable amount of noise at the output of U3,
  541. originating at the microphone and within the input circuitry of U1, and
  542. highly amplified by U1 and U2. The trimpot should be adjusted so that the
  543. comparator threshold is just outside the normal excursion of the noise signal
  544. ("off to one side"), otherwise "silence" at the microphone will become, at
  545. the speaker output from the computer, a loud hiss with a strong component at
  546. half the sampling frequency. 
  547.  
  548. I used LF356's for U1, U2, and U3, and an LM393 for U4. All amplifiers should
  549. have power supply bypass capacitors (not shown). The microphone is a 600 ohm
  550. dynamic type. The +-12 volt power supply should be quiet and well-regulated;
  551. the one in the PC is too noisy unless you use heavy filtering. Power supply
  552. bypassing consists of attaching capacitors in the 0.1 uF range (up to 1 uF is
  553. ok) DIRECTLY across the power supply pins of each amplifier chip. Layout is
  554. important here. The capacitors should use the shortest possible wire length
  555. to the pins of the chips. There will be 8 caps required: one from +12 to
  556. ground and one from -12 to ground for each chip. If you use dual or quad
  557. amplifier chips instead of the LF356's, then of course only one set of caps
  558. is required per actual chip. The purpose of the bypass caps is to provide a
  559. highly localized low-impedance power source at each chip to prevent unwanted
  560. positive feedback through the power leads (feedback between different chips).
  561.  
  562.  
  563. Comments on the Digitization Technique
  564. --------------------------------------
  565.  
  566. The speaker on the PC and its associated driver circuitry is quite simple and
  567. crude, having been designed primarily for creating single square-wave tones
  568. of various audio frequencies. This speaker is typically driven by a pair of
  569. transistors used as current amplifier which is in turn driven directly by the
  570. output of a TTL gate. This results in only two possibilities of voltage
  571. across the voice coil: 0 volts and 5 volts. Any sound to be reproduced by
  572. this system must be reduced to an approximation in the form of a stream of
  573. constant-amplitude, variable-width rectangular pulses.
  574.  
  575. Examination of a speech waveform on an oscilloscope display quickly tells us
  576. that it is not going to be possible to even remotely mimic this waveform
  577. under the above restrictions. Much of the information contained in the
  578. waveform is in the form of amplitude variations, and this is the one
  579. attribute we cannot reproduce. It is initially tempting to try to use the
  580. technique of the "class D" amplifier to create the waveform, using high-speed
  581. pulse width modulation and depending on the mechanical characteristics of the
  582. speaker and those of the human ear to provide the missing low-pass filtering.
  583. Assuming the sampling rate to be 8 KHz (based on the Nyquist criterion) and,
  584. to conserve memory, assuming the samples to contain only 4 bits of amplitude
  585. information (16 levels), we can see that data accumulates at a rate of 4k
  586. bytes per second, which is certainly acceptable. The problem comes when we
  587. try to play back the sound. Pulses occur at intervals of 125 microseconds,
  588. which doesn't seem too bad, but since each pulse can have 16 possible widths,
  589. it is necessary to time the pulses with a resolution of well under 8
  590. microseconds. This is only a couple of instruction times on a 4.77 MHz XT,
  591. and even on a fast 80386 it doesn't give the CPU much time between bits to
  592. shift bits, read and increment a pointer, check the pointer to see if it's
  593. done yet, etc., not to mention the difficulty of servicing unrelated
  594. interrupts. 
  595.  
  596. The search for simpler (but still usable) and less CPU-intensive methods of
  597. reproducing speech leads to the question of what information in the waveform
  598. we can discard without an unacceptable loss of intelligibility. My
  599. experiments with running speech signals through a graphic equalizer revealed
  600. that the lower-frequency components, those which are most visible to the eye
  601. on the oscilloscope, are actually of minimal importance in understanding
  602. speech. This is also demonstrated by the fact that a whisper is just as
  603. understandable as normal speech, but does not make use of vibrating vocal
  604. chords, which are the primary source of low-frequency components in the
  605. voice.
  606.  
  607. The present digitizer circuit makes use of this observation by filtering out
  608. most of the low-frequency components of the sound signal. Knowing that the
  609. speaker cone cannot move instantaneously and serves as an approximation to
  610. a mechanical integrator at high audio frequencies leads to the idea of
  611. differentiating the input waveform. This accomplishes the following result:
  612. the direction of movement of the speaker cone corresponds to the direction of
  613. movement (derivative) of the waveform. Amplitude information is lost. As it
  614. turns out, this is sufficiently understandable to be worth pursuing.
  615.